查看原文
其他

Stata:寻找让实证结果表现不好的样本

连享会 连享会 2023-10-24

👇 连享会 · 推文导航 | www.lianxh.cn

连享会 · 2022暑期班

作者:李烨阳 (浙江大学)
邮箱:li_yeyang95@163.com

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

编者按:本文参考自 Github 上的「SampleFilter」项目,特此致谢!


目录

  • 1. 引言

  • 2. 基本思想

  • 3. Stata 命令介绍

  • 4. Stata 应用实例

    • 4.1 OLS 和固定效应

    • 4.2 logit 和 probit

    • 4.3 IV 估计和其他

  • 5. 相关推文



1. 引言

在实证分析中,离群值、数据清理过程错误等问题的存在会导致回归结果不符合预期,但是由于其可能的原因非常复杂,我们往往需要消耗大量的时间去逐一排查。Github 上一项基于 Python 的开源项目 SampleFilter 为这一问题提供了解决方案。它通过有放回的自抽样,寻找符合预期结果的可行子样本和表现不佳的样本。在此基础上,研究者可以对表现不佳的子样本进行分析,从而更快的找到回归结果不符合预期的原因。

本文首先对 SampleFilter 的基本思想进行介绍,然后使用 Stata 重写该项目,并提供了 Stata 使用范例。

2. 基本思想

SampleFilter 项目基于 Python 语言编写,其基本思想为:

  • 第一步:进行有放回的样本自抽样,直到找到一个符合模型预期结果的可行子样本,或者超过迭代次数停止;
  • 第二步:如果步骤 1 找到一个可行子样本,就在此基础上尝试逐个添加未被纳入的样本。如果加入新样本后仍然符合模型预期结果,则保留,否则不保留;
  • 第三步:重复步骤 1 和步骤 2,并保留样本量最多的可行样本,被排除在外的则是表现不佳的样本。如果在规定迭代次数内始终找不到可行样本,则认为寻找失败。

该项目的具体实现流程如下图所示 (高清图):

3. Stata 命令介绍

本文使用 Stata 重写了 SampleFilter 项目,基本思想和流程与之一致。差别在于,用 Stata 重写的 samplefilter 命令支持分组回归,并对各类回归模型的命令具有较强的兼容性。

samplefilter 命令安装:

cnssc install lxhget, replace
lxhget samplefilter.pkg, install replace

samplefilter 命令语法:

samplefilter eq [if] [in] [ fw pw iw ],
cmd(str) significant(vars)
[subsamplename(newvar) positive(vars) negative(vars)
p_value(#) lr(#) rr(#) k(#) iteration(#)
zvalue dots1 dots2
*]

必选项有:

  • eq:模型设定方程,要与所选用的回归命令的要求格式一致;
  • cmd: 模型回归命令,例如 reg
  • significant:预期显著的变量,最小缩写 sig

可选项有:

  • subsamplename:可行子样本标识变量名,默认字符串为 samplefilter,即该变量将命名为 samplefilter_#,若不分组回归则 # 为 1,分组回归中 # 为分组序号;
  • positive:预期为正的变量,最小缩写 pos
  • negative:预期为负的变量,最小缩写 neg
  • p_value: 显著性的临界 值,默认值 0.05,最小缩写 p
  • lr:初始样本的样本量占总样本比例的下限,默认值 0.5;
  • rr:初始样本的样本量占总样本比例的上限,默认值 0.7;
  • k:重复整个过程的批次数,默认值 5;
  • iteration:每批次的最大迭代次数,默认值 1000;
  • zvalue:默认求 值,加此选项求 值,最小缩写 z
  • dots1:加此选项在每批次寻找可行子样本时打印进度条 (推荐用于模型回归单次运算时间较长,或者 interation 较大时);
  • dots2:加此选项在每批寻找到的可行子样本基础上,扩大样本时打印进度条 (推荐用于模型回归单次运算时间较长,或者样本量较大时);
  • *:可以增加任意所选用的回归命令所允许的选项。

4. Stata 应用实例

本部分给出了使用 samplefilter 命令探测表现不佳样本的几个范例 (说明:本文中的例子只展示命令的使用方法,不考虑现实和理论含义)。

4.1 OLS 和固定效应

首先导入数据并设定变量的预期显著性 (必须)、符号正负性 (非必须)。

. sysuse auto, clear
. global y price // 被解释变量
. global x mpg rep78 headroom trunk weight length turn displacement gear_ratio foreign // 全部解释变量
. global sig "headroom weight" // 预期显著的变量
. global pos "weight" // 预期符号为正的变量
. global neg "headroom" // 预期符号为负的变量

然后利用 samplefilter 命令探测表现不佳的样本:

. samplefilter $y $x, sig($sig) pos($pos) neg($neg) cmd(reg) p(0.05)

全样本结果:

Source | SS df MS Number of obs = 69
-------------+---------------------------------- F(10, 58) = 8.66
Model | 345416162 10 34541616.2 Prob > F = 0.0000
Residual | 231380797 58 3989324.09 R-squared = 0.5989
-------------+---------------------------------- Adj R-squared = 0.5297
Total | 576796959 68 8482308.22 Root MSE = 1997.3
------------------------------------------------------------------------------
price | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
mpg | -21.805 77.360 -0.28 0.779 -176.658 133.047
rep78 | 184.793 331.792 0.56 0.580 -479.361 848.948
headroom | -635.492 383.024 -1.66 0.102 -1402.198 131.214
trunk | 71.499 95.050 0.75 0.455 -118.764 261.763
weight | 4.521 1.412 3.20 0.002 1.695 7.347
length | -76.491 40.403 -1.89 0.063 -157.366 4.384
turn | -114.278 123.537 -0.93 0.359 -361.565 133.009
displacement | 11.540 8.378 1.38 0.174 -5.231 28.311
gear_ratio | -318.648 1124.340 -0.28 0.778 -2569.259 1931.964
foreign | 3334.848 957.225 3.48 0.001 1418.754 5250.943
_cons | 9789.494 6710.193 1.46 0.150 -3642.416 23221.404
------------------------------------------------------------------------------

第1批找到的可行子样本的样本量更大,共57个样本
第2批没有找到样本量更大的可行子样本的
第3批没有找到样本量更大的可行子样本的
第4批没有找到样本量更大的可行子样本的
第5批找到的可行子样本的样本量更大,共59个样本
可行子样本结果:

Source | SS df MS Number of obs = 59
-------------+---------------------------------- F(10, 48) = 8.13
Model | 258052864 10 25805286.4 Prob > F = 0.0000
Residual | 152282700 48 3172556.25 R-squared = 0.6289
-------------+---------------------------------- Adj R-squared = 0.5516
Total | 410335564 58 7074751.1 Root MSE = 1781.2
------------------------------------------------------------------------------
price | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
mpg | 29.449 70.548 0.42 0.678 -112.397 171.295
rep78 | 343.238 329.438 1.04 0.303 -319.142 1005.618
headroom | -763.087 361.825 -2.11 0.040 -1490.584 -35.590
trunk | 110.767 91.330 1.21 0.231 -72.864 294.399
weight | 4.840 1.331 3.64 0.001 2.164 7.516
length | -68.718 37.654 -1.82 0.074 -144.427 6.991
turn | -29.910 112.902 -0.26 0.792 -256.914 197.094
displacement | 3.763 8.192 0.46 0.648 -12.707 20.234
gear_ratio | -291.453 1105.221 -0.26 0.793 -2513.648 1930.743
foreign | 3014.364 986.754 3.05 0.004 1030.363 4998.366
_cons | 3546.345 6410.416 0.55 0.583 -9342.660 16435.351
------------------------------------------------------------------------------

在程序运行结束之后,会生成 subsample_1 变量,若 subsample_1 = 0 代表表现不好的样本,subsample_1 == 1 则代表可行子样本。在此基础上,我们可以对这两组样本进行描述性统计分析,以找到结果不符合预期的原因。例如最简单的,可以进行分组描述统计:

. label define samplefilter 1 "可行子样本" 0 "表现不好样本"
. label values samplefilter_1 samplefilter
. bys samplefilter_1 : sum $y $x

-> samplefilter_1 = 表现不好样本

Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
price | 5 8742.6 3634.539 4934 13466
mpg | 5 18.4 4.722288 14 25
rep78 | 5 3.2 1.48324 1 5
headroom | 5 2.9 .9617692 1.5 4
trunk | 5 12 5.43139 7 20
-------------+---------------------------------------------------------
weight | 5 3324 835.7512 2240 4330
length | 5 195.2 18.51216 172 221
turn | 5 40.2 3.193744 36 44
displacement | 5 242.2 127.1326 107 425
gear_ratio | 5 2.886 .5113022 2.28 3.55
-------------+---------------------------------------------------------
foreign | 5 .4 .5477226 0 1
-----------------------------------------------------------------------

-> samplefilter_1 = 可行子样本

Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
price | 64 5943.188 2782.066 3291 15906
mpg | 64 21.51563 5.9174 12 41
rep78 | 64 3.421875 .9562607 1 5
headroom | 64 3.007813 .8521317 1.5 5
trunk | 64 14.07813 4.262441 5 23
-------------+---------------------------------------------------------
weight | 64 3009.219 791.7457 1760 4840
length | 64 187.75 23.07957 142 233
turn | 64 39.76563 4.541667 31 51
displacement | 64 194.5469 90.39787 79 400
gear_ratio | 64 3.008125 .4619176 2.19 3.89
-------------+---------------------------------------------------------
foreign | 64 .296875 .4604927 0 1
-----------------------------------------------------------------------

samplefilter 命令也可以适用于分组回归,例如:

. gen group =_n<40
. global sig "trunk"
. bys group: samplefilter $y $x, sig($sig) cmd(reghdfe) p(0.1) sub(subsample) lr(0.6) rr(0.8) noabsorb

-> group = 0
全样本结果: 省略
可行子样本结果:
HDFE Linear regression Number of obs = 26
Absorbing 1 HDFE group F( 10, 15) = 4.43
Prob > F = 0.0050
R-squared = 0.7471
Adj R-squared = 0.5785
Within R-sq. = 0.7471
Root MSE = 1489.9890
------------------------------------------------------------------------------
price | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
mpg | -28.282 92.793 -0.30 0.765 -226.067 169.502
rep78 | -11.357 566.240 -0.02 0.984 -1218.269 1195.554
headroom | -544.745 493.119 -1.10 0.287 -1595.803 506.313
trunk | 215.979 115.565 1.87 0.081 -30.341 462.299
weight | 0.848 2.113 0.40 0.694 -3.656 5.351
length | 104.254 61.141 1.71 0.109 -26.065 234.572
turn | -589.023 287.757 -2.05 0.059 -1202.362 24.316
displacement | 12.332 16.756 0.74 0.473 -23.383 48.046
gear_ratio | -385.158 1488.517 -0.26 0.799 -3557.857 2787.541
foreign | 2124.030 2014.989 1.05 0.309 -2170.818 6418.877
_cons | 5293.157 10023.993 0.53 0.605 -1.61e+04 26658.793
------------------------------------------------------------------------------

-> group = 1
全样本结果: 省略
可行子样本结果:
HDFE Linear regression Number of obs = 34
Absorbing 1 HDFE group F( 9, 24) = 13.98
Prob > F = 0.0000
R-squared = 0.8398
Adj R-squared = 0.7797
Within R-sq. = 0.8398
Root MSE = 1680.2737
------------------------------------------------------------------------------
price | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
mpg | 72.391 156.843 0.46 0.649 -251.318 396.100
rep78 | -753.208 495.403 -1.52 0.141 -1775.669 269.253
headroom | -460.110 433.526 -1.06 0.299 -1354.864 434.644
trunk | 386.477 192.034 2.01 0.056 -9.861 782.816
weight | 14.140 2.344 6.03 0.000 9.301 18.978
length | -363.173 85.292 -4.26 0.000 -539.208 -187.139
turn | -382.790 203.964 -1.88 0.073 -803.751 38.171
displacement | -1.449 9.594 -0.15 0.881 -21.250 18.353
gear_ratio | 842.659 1605.453 0.52 0.604 -2470.833 4156.150
foreign | 0.000 (omitted)
_cons | 41278.234 11339.241 3.64 0.001 17875.191 64681.276
------------------------------------------------------------------------------

samplefilter 命令也可以兼容 reghdfe 等命令,但要注意应增加所使用命令所必须添加的选项。例如,如果使用 reghdfe 命令,则必须增加 absorb()noabsorb 选项,同时也支持增加其他所使用命令支持的选项。例如:

. cap drop subsample*
. global sig "mpg trunk gear_ratio"
. samplefilter $y $x, sig($sig) cmd(reghdfe) p(0.1) sub(subsample) noabsorb i(100) k(2)
. cap drop subsample*
. samplefilter $y $x, sig($sig) cmd(reghdfe) p(0.1) sub(subsample) noabsorb i(1000) k(5) dots1

4.2 logit 和 probit

samplefilter 命令可以兼容 logitprobit 等命令,但注意需要调整为计算 值 (即增加 zvalue 选项)。例如:

. webuse lbw, clear
. global x age lwt i.race smoke ptl ht ui
. global sig lwt ui ht ptl
. global pos ui ht ptl
. global neg lwt
. samplefilter low $x, sig($sig) cmd(logit) p(0.1) sub(subsample) i(5000) z dots1

全样本结果:省略

~~~~~~~~~~~~~~~第1批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第1批找到的可行子样本的样本量更大,共171个样本
~~~~~~~~~~~~~~~第2批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第2批找到的可行子样本的样本量更大,共177个样本
~~~~~~~~~~~~~~~第3批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第3批没有找到样本量更大的可行子样本的
~~~~~~~~~~~~~~~第4批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第4批找到的可行子样本的样本量更大,共182个样本
~~~~~~~~~~~~~~~第5批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第5批没有找到样本量更大的可行子样本的

可行子样本结果:
Logistic regression Number of obs = 182
LR chi2(8) = 30.62
Prob > chi2 = 0.0002
Log likelihood = -97.026723 Pseudo R2 = 0.1363
------------------------------------------------------------------------------
low | Coefficient Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
age | -0.036 0.037 -0.97 0.330 -0.109 0.037
lwt | -0.012 0.007 -1.75 0.081 -0.026 0.001
race |
Black | 0.968 0.552 1.75 0.079 -0.113 2.050
Other | 0.805 0.448 1.79 0.073 -0.074 1.684
smoke | 0.809 0.416 1.94 0.052 -0.007 1.625
ptl | 0.626 0.376 1.67 0.096 -0.110 1.362
ht | 1.803 0.684 2.64 0.008 0.463 3.144
ui | 0.872 0.464 1.88 0.060 -0.038 1.782
_cons | 0.343 1.204 0.29 0.776 -2.017 2.704
------------------------------------------------------------------------------

. cap drop subsample*
. samplefilter low $x, sig($sig) pos($pos) neg($neg) cmd(probit) p(0.1) sub(subsample) i(5000) z dots1

全样本结果:省略

~~~~~~~~~~~~~~~第1批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第1批找到的可行子样本的样本量更大,共180个样本
~~~~~~~~~~~~~~~第2批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第2批没有找到样本量更大的可行子样本的
~~~~~~~~~~~~~~~第3批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第3批找到的可行子样本的样本量更大,共185个样本
~~~~~~~~~~~~~~~第4批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第4批没有找到样本量更大的可行子样本的
~~~~~~~~~~~~~~~第5批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第5批没有找到样本量更大的可行子样本的

可行子样本结果:
Probit regression Number of obs = 185
LR chi2(8) = 39.38
Prob > chi2 = 0.0000
Log likelihood = -95.356035 Pseudo R2 = 0.1712
------------------------------------------------------------------------------
low | Coefficient Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
age | -0.016 0.022 -0.73 0.465 -0.059 0.027
lwt | -0.011 0.004 -2.55 0.011 -0.019 -0.002
race |
Black | 0.740 0.320 2.32 0.021 0.114 1.367
Other | 0.414 0.263 1.58 0.115 -0.101 0.929
smoke | 0.585 0.239 2.45 0.014 0.117 1.053
ptl | 0.491 0.224 2.19 0.029 0.051 0.930
ht | 1.178 0.426 2.77 0.006 0.343 2.012
ui | 0.615 0.285 2.16 0.031 0.057 1.173
_cons | 0.435 0.724 0.60 0.548 -0.984 1.854
------------------------------------------------------------------------------

4.3 IV 估计和其他

samplefilter 命令同样可以兼容 ivreg2 等逗号前并非「因变量 + 自变量」模式的命令。例如:

. use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta,clear
. ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst

与之对应的 samplefilter 命令为:

. global equation "lwage exper expersq (educ=age kidslt6 kidsge6)"
. global sig expersq
. samplefilter $equation, sig($sig) cmd(ivreg2) p(0.05) sub(subsample) i(500) ///
> robust savefirst z dots1 dots2

全样本结果:省略

~~~~~~~~~~~~~~~第1批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第1批找到一个可行子样本,开始尝试在此基础上扩大样本
第1批找到的可行子样本的样本量更大,共391个样本
~~~~~~~~~~~~~~~第2批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第2批找到一个可行子样本,开始尝试在此基础上扩大样本
第2批找到的可行子样本的样本量更大,共411个样本
~~~~~~~~~~~~~~~第3批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第3批找到一个可行子样本,开始尝试在此基础上扩大样本
第3批找到的可行子样本的样本量更大,共425个样本
~~~~~~~~~~~~~~~第4批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第4批找到一个可行子样本,开始尝试在此基础上扩大样本
第4批没有找到样本量更大的可行子样本的
~~~~~~~~~~~~~~~第5批可行子样本搜寻中,共5批~~~~~~~~~~~~~~~
第5批找到一个可行子样本,开始尝试在此基础上扩大样本
第5批没有找到样本量更大的可行子样本的

可行子样本结果:
Estimates efficient for homoskedasticity only
Statistics robust to heteroskedasticity
Number of obs = 425
F( 3, 421) = 6.49
Prob > F = 0.0003
Total (centered) SS = 214.1262261 Centered R2 = 0.1631
Total (uncentered) SS = 822.4470383 Uncentered R2 = 0.7821
Residual SS = 179.212182 Root MSE = .6494
------------------------------------------------------------------------------
| Robust
lwage | Coefficient std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
educ | 0.088 0.088 1.01 0.313 -0.083 0.260
exper | 0.046 0.016 2.79 0.005 0.014 0.078
expersq | -0.001 0.000 -1.98 0.048 -0.002 -0.000
_cons | -0.300 1.074 -0.28 0.780 -2.405 1.804
------------------------------------------------------------------------------
Underidentification test (Kleibergen-Paap rk LM statistic): 10.982
Chi-sq(3) P-val = 0.0118
------------------------------------------------------------------------------
Weak identification test (Cragg-Donald Wald F statistic): 4.245
(Kleibergen-Paap rk Wald F statistic): 4.917
Stock-Yogo weak ID test critical values: 5% maximal IV relative bias 13.91
10% maximal IV relative bias 9.08
20% maximal IV relative bias 6.46
30% maximal IV relative bias 5.39
10% maximal IV size 22.30
15% maximal IV size 12.83
20% maximal IV size 9.54
25% maximal IV size 7.80
Source: Stock-Yogo (2005). Reproduced by permission.
NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors.
------------------------------------------------------------------------------
Hansen J statistic (overidentification test of all instruments): 0.640
Chi-sq(2) P-val = 0.7263
------------------------------------------------------------------------------
Instrumented: educ
Included instruments: exper expersq
Excluded instruments: age kidslt6 kidsge6
------------------------------------------------------------------------------

samplefilter 命令的兼容性不止局限于上述例子中所列出的模型估计命令,如果需要使用其他模型估计命令,读者可以根据范例的格式进行尝试。

5. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 筛选 程序, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 专题:Stata命令
    • Stata:控制变量组合的筛选-tuples
    • moremata程序包手动安装方法
  • 专题:Stata程序
    • Stata程序:最大公约数和最小公倍数
    • Stata程序:10 分钟快乐编写 ado 文件
    • Stata程序:Monte-Carlo-模拟之产生符合特定分布的随机数
    • Stata程序:我的程序多久能跑完?
    • Stata程序:暂元-(local)-和全局暂元-(global)
    • Stata程序:切割文件路径和文件名
    • Stata程序:是否有类似-Python-中的-zip()-函数
    • Stata程序:在我的程序中接纳另一个程序的所有选项
    • Stata 程序:数值求解极值的基本思想
  • 专题:回归分析
    • Stata论文复现:高维线性回归的变量筛选-baing-ocmt
    • combinatorics:模型设定之自动筛选变量
    • gsreg:自动模型设定和变量筛选
  • 专题:面板数据
    • ocmt:高维固定效应模型的变量筛选问题
  • 专题:PSM-Matching
    • Stata:psestimate-倾向得分匹配(PSM)中协变量的筛选
    • Stata:psestimate-倾向得分匹配(PSM)中匹配变量的筛选
  • 专题:合成控制法
    • Stata:合成控制法程序分享
  • 专题:内生性-因果推断
    • Robins - Causal Inference: What if - 数据和程序
  • 专题:时间序列
    • vgets:VAR模型设定和筛选-T240
  • 专题:机器学习
    • 图解Lasso系列A:Lasso的变量筛选能力

课程推荐:因果推断实用计量方法
主讲老师:丘嘉平教授
🍓 课程主页https://gitee.com/lianxh/YGqjp

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存